/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Threads;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Luis_Angel
 */
public class TestAFondo {

    public TestAFondo() {
        //  Thread t = new Thread(this);
        //  t.start();
    }

    public static void prueba1() {
        Thread t = new Thread(new Tarea1());
        t.start();
        System.out.println("iniciando");
        System.out.println("terminando");
        
        // System.out.println("");
        /*luego de esto la salida sera: pero no se garantiza ya q puede variar pero siempre va primero (inciiando)
         *  iniciando
        terminando
        0123
         */
    }

    public static void prueba2() throws InterruptedException {
        Thread t = new Thread(new Tarea1());
        t.start();
        t.join();
        System.out.println("iniciando");
        System.out.println("terminando");

        // System.out.println("");
        /*luego de esto SIEMPRE la salida sera:
         *  0123iniciando
        terminando
         */
    }

    public static void prueba3() throws InterruptedException {
        Thread t = new Thread(new Tarea1());
        Thread t1 = new Thread(new Tarea2());
        t.start();
        t.join();
        t1.start();
        t1.join();
        System.out.println("iniciando");
        System.out.println("terminando");
        
        // System.out.println("");
        /*luego de esto SIEMPRE la salida sera:
         *  0123aaaaaaaaaainiciando
            terminando
         */
    }

    public static void prueba4() throws InterruptedException {
        Thread t = new Thread(new Tarea1());
        Thread t1 = new Thread(new Tarea2());
        t.start();
        t1.start();
        t.join();
        System.out.println("iniciando");
        System.out.println("terminando");

        // System.out.println("");
        /*luego de esto la salida sera (EN LA MAYORIA DE VECES: de 15 pruebas fueron 11 coincidencias):
         *  aaaaaaaaaa0123iniciando
            terminando
         */
    }

     public static void prueba5() throws InterruptedException {
        Thread t = new Thread(new Tarea1());
        Thread t1 = new Thread(new Tarea2());
        t.start();
        t1.start();
        t.join();
        t1.join();
        
        System.out.println("iniciando");
        System.out.println("terminando");

        // System.out.println("");
        /*luego de esto SIEMPRE la salida sera :
         *  aaaaaaaaaa0123iniciando
            terminando
         */
    }

     public static void prueba6() throws InterruptedException {
        Thread t = new Thread(new Tarea1());
        Thread t1 = new Thread(new Tarea2());
        t.start();
        System.out.println("iniciando");
        System.out.println("terminando");
        t1.start();
        t1.join();
        t.join();
        // System.out.println("");
        /*luego de esto SIEMPRE la salida sera :
         * iniciando
            terminando
            0123aaaaaaaaaa
         */
    }

    public static void prueba7() throws InterruptedException {
        Thread t = new Thread(new Tarea4());
        Thread t1 = new Thread(new Tarea3());
        t.start();
        t1.start();
        t.join();
        t1.join();

        System.out.println("iniciando");
        System.out.println("terminando");

        // System.out.println("");
        /*luego de esto SIEMPRE la salida sera :
         *  aaaaaaaaaa0123iniciando
            terminando
         */
    }

    public static void prueba8() throws InterruptedException {
        Thread t = new Thread(new Tarea4());
        t.start();
        Thread.sleep(1000);
       // t.join();
        System.out.println("iniciando");
        System.out.println("terminando");

        // System.out.println("");
        /*luego de esto SIEMPRE la salida sera:
         * 01iniciando
            terminando
            23
         */
    }

    public static void prueba9() throws InterruptedException {
        Thread t = new Thread(new Tarea4());
        t.start();
        Thread.sleep(1000);
        t.join();
        System.out.println("iniciando");
        System.out.println("terminando");

        // System.out.println("");
        /*luego de esto SIEMPRE la salida sera:
         * 0123iniciando
            terminando
         */
    }

     public static void prueba10() throws InterruptedException {
        Thread t = new Thread(new Tarea1());
        t.start();
         System.out.println("1->" + t.isAlive());//true
        t.join();
        System.out.println("2->" + t.isAlive());//false
        System.out.println("iniciando");
        System.out.println("terminando");
        System.out.println("3->" + t.isAlive());//false

        // System.out.println("");
        /*luego de esto SIEMPRE la salida sera:
         *  0123iniciando
        terminando
         */
    }
    public static void main(String[] args) throws Exception {
        //Thread t = new Thread(this); no es permitido ya q no se puede usar this ni super en un metodo estatico
        //  prueba1();
        //  prueba2();
        //prueba3();
       // prueba4();
        prueba10();
    }
}

class Tarea1 implements Runnable {

    public void run() {
        for (int i = 0; i < 4; i++) {
            System.out.print(i);
        }
    }
}

class Tarea2 implements Runnable {

    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.print("a");
        }
    }
}

class Tarea3 implements Runnable {

    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.print("a");
            try {
                Thread.sleep(500);
            } catch (InterruptedException ex) {
                Logger.getLogger(Tarea3.class.getName()).log(Level.SEVERE, null, ex);
            }
            
        }
    }
}

class Tarea4 implements Runnable {

    public void run() {
        for (int i = 0; i < 4; i++) {
            System.out.print(i);
             try {
                Thread.sleep(500);
            } catch (InterruptedException ex) {
                Logger.getLogger(Tarea3.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
